package com.nj.framework.dao;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

/**   
*    
* 项目名称：publicservice   
* 类名称：StandardGenericDAO   
* @version
* 类描述：标准JdbcTemplate基类，负责提供JdbcTemplate对象处理
* @version   
* 创建人：孙峰 
* @version
* 创建时间：2015-10-24 下午01:45:59 
* @version  
* 修改人：孙峰    修改时间：2015-10-24 下午01:45:59   
* @version
* 修改备注：   
*
*/
public abstract class StandardGenericDAO {
	@Autowired
	@Qualifier("jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	
	/**
	 * 已知返回类型的查询列表
	 */
	protected final <T> List<T> findAllTList(String sql, RowMapper<T> r, Object... values) {
		return this.jdbcTemplate.query(sql, values, r);
	}
	
	/**
	 * 在不知道返回类型的情况下查询列表
	 */
	protected final List<Map<String,Object>> findAllList(String sql,  Object... values) {	
		return this.jdbcTemplate.queryForList(sql, values);
		
	}
	
	/**
	 * 查询某一个对象
	 * @throws ClassNotFoundException 
	 * @throws DataAccessException 
	 * */
	protected final <T> T  findByObject(String sql, Class<T> t, Object... values) throws DataAccessException, ClassNotFoundException {
		return this.jdbcTemplate.queryForObject(sql, t, values);
	}
	/**
	 * 没有映射的分页列表
	 */
	protected final List<Map<String,Object>> findPageList(String sql, int rowNum, int page, Object... values) {
		sql = "SELECT * FROM (( SELECT ROWNUM AS NUMROW, jc.* from (" + sql + ") jc)) WHERE NUMROW > ? AND NUMROW < ?";
		// 开始记录行
		int start = (page - 1) * rowNum;
		// 结束记录行
		int end = page * rowNum + 1;
		Object[] obj = new Object[values.length + 2];
		for(int i = 0;i < values.length;i++) {
			obj[i] = values[i];
		}
		obj[values.length] = start;
		obj[values.length + 1] = end;
		return this.jdbcTemplate.queryForList(sql, obj);
	}
	
	/**
	 * 有映射的分页列表
	 */
	protected final <T> List<T> findPageList(String sql,RowMapper<T> mapper, int rowNum, int page, Object... values) {
		sql = "SELECT * FROM (( SELECT ROWNUM AS NUMROW, jc.* from (" + sql + ") jc)) WHERE NUMROW > ? AND NUMROW < ?";
		// 开始记录行
		int start = (page - 1) * rowNum;
		// 结束记录行
		int end = page * rowNum + 1;
		Object[] obj = new Object[values.length + 2];
		for(int i = 0;i < values.length;i++) {
			obj[i] = values[i];
		}
		obj[values.length] = start;
		obj[values.length + 1] = end;		
		return this.jdbcTemplate.query(sql, mapper, obj);
	}
	/**
	 * 插入数据
	 */
	public int insert(String sql, Object... values) {
		return this.jdbcTemplate.update(sql, values);
	}
	
	/**
	 * 删除数据
	 */
	public int delete(String sql, Object... values) {
		return this.jdbcTemplate.update(sql, values);
	}
	
	/**
	 * 修改数据
	 */
	public int update(String sql, Object... values) {
		return this.jdbcTemplate.update(sql, values);
	}
}
